package com.qfedu.edu.config;

import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author xiaobobo
 * @title: RedisConfig
 * @projectName cd-fy-2401-third-project-parent
 * @description: TODO
 * @date 2024/9/29  9:04
 */
@SpringBootConfiguration
@ConditionalOnProperty(name = "framework.config.redis", havingValue = "true")
public class RedisConfig {


    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
     RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
     redisTemplate.setConnectionFactory(redisConnectionFactory);
     //什么是序列化呢? 我们的数据以一种什么样的形式写入Redis
     // 加密  ... JSON   ... 自定义形式写入
     redisTemplate.setKeySerializer(new StringRedisSerializer());
     //如果这个值 是对象的话 那么直接以JSON格式的形式写入redis中
     redisTemplate.setValueSerializer(new FastJsonRedisSerializer<>(Object.class));
     //设置其他的序列化方式
     redisTemplate.setHashKeySerializer(new StringRedisSerializer());
     redisTemplate.setHashValueSerializer(new FastJsonRedisSerializer<>(Object.class));
     //设置支持事务 只有支持了事务那么这个时候 redis的事务 才能和 String的事务耦合到一起
     redisTemplate.setEnableTransactionSupport(true);
     return  redisTemplate;
    }

 /**
  * 操作字符串的时候这个对象
  * @return
  */
 @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
     StringRedisTemplate redisTemplate = new StringRedisTemplate();
     redisTemplate.setConnectionFactory(redisConnectionFactory);
     //什么是序列化呢? 我们的数据以一种什么样的形式写入Redis
     // 加密  ... JSON   ... 自定义形式写入
     redisTemplate.setKeySerializer(new StringRedisSerializer());
     //如果这个值 是对象的话 那么直接以JSON格式的形式写入redis中
     redisTemplate.setValueSerializer(new StringRedisSerializer());
     redisTemplate.setEnableTransactionSupport(true);
     return  redisTemplate;
    }


}
